import mongoose, { Document, Schema } from 'mongoose';

export interface IInfo extends Document {

    title: string,                // 消息标题（如“您的订单已发货”）
    content: string,              // 消息正文（支持纯文本或简单 HTML / Markdown）
    type: 'system' | 'notice' | 'task' | 'alert', // 消息类型（见下文说明）
    status: 'unread' | 'read',       // 用户侧状态（针对接收者）
    receiverId: mongoose.Schema.Types.ObjectId,         // 接收者ID（用户/角色/部门）
    receiverType: 'user' | 'role' | 'all', // 接收者类型（支持群发）
    senderId?: mongoose.Schema.Types.ObjectId,          // 发送者ID（系统消息可为空）
    createdAt: Date,              // 创建时间
    readAt?: Date                 // 阅读时间（可选）
}

const infoSchema = new Schema<IInfo>({
    title: {
        type: String,
        required: [true, '消息标题是必填项'],
        trim: true,
        minlength: [2, '消息标题至少需要2个字符'],
        maxlength: [50, '消息标题不能超过50个字符']
    },
    content: {
        type: String,
        required: [true, '消息正文是必填项'],
        trim: true,
        minlength: [2, '消息正文至少需要2个字符'],
        maxlength: [500, '消息正文不能超过500个字符']
    },
    type: {
        type: String,
        enum: ['system', 'notice', 'task', 'alert'],
        required: [true, '消息类型是必填项'],
        trim: true
    },
    status: {
        type: String,
        enum: ['unread', 'read'],
        default: 'unread'
    },
    receiverId: {
        type: mongoose.Schema.Types.ObjectId,
        required: [true, '接收者ID是必填项']
    },
    receiverType: {
        type: String,
        enum: ['user', 'role', 'all'],
        required: [true, '接收者类型是必填项'],
        trim: true
    },
    senderId: {
        type: mongoose.Schema.Types.ObjectId,
        default: null
    },
    readAt: {
        type: Date,
        default: null
    }

}, {
    timestamps: true // 自动添加 createdAt 和 updatedAt
});

// 创建索引
infoSchema.index({ createdAt: -1 });

// 虚拟字段（不存储在数据库中）
infoSchema.virtual('displayName').get(function () {
    return `${this.title} (${this.type})`;
});

// 实例方法
infoSchema.methods.toJSON = function () {
    const msg = this.toObject();
    return msg;
};

// 静态方法
infoSchema.statics.findByType = function (type: string) {
    return this.find({ type: type });
};

export const Info = mongoose.model<IInfo>('Info', infoSchema);
